home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / Python 133 68K / Mac / Lib / test / AEservertest.py next >
Text File  |  1996-05-20  |  5KB  |  212 lines

  1. """AEservertest - Test AppleEvent server interface
  2.  
  3. (adapted from Guido's 'echo' program).
  4.  
  5. Build an applet from this source, and include the aete resource that you
  6. want to test. Use the AEservertest script to try things.
  7. """
  8.  
  9. import sys
  10. sys.stdout = sys.stderr
  11. import traceback
  12. import MacOS
  13. import AE
  14. from AppleEvents import *
  15. import Evt
  16. from Events import *
  17. import Menu
  18. import Dlg
  19. import Win
  20. from Windows import *
  21. import Qd
  22. import macfs
  23.  
  24. import aetools
  25. import EasyDialogs
  26.  
  27. kHighLevelEvent = 23                # Not defined anywhere for Python yet?
  28.  
  29. Quit='Quit'
  30.  
  31. def mymessage(str):
  32.     err = AE.AEInteractWithUser(kAEDefaultTimeout)
  33.     if err:
  34.         print str
  35.     EasyDialogs.Message(str)
  36.  
  37. def myaskstring(str, default=''):
  38.     err = AE.AEInteractWithUser(kAEDefaultTimeout)
  39.     if err:
  40.         return default
  41.     return EasyDialogs.AskString(str, default)
  42.  
  43. def main():
  44.     echo = EchoServer()
  45.     yield = MacOS.EnableAppswitch(-1)        # Disable Python's own "event handling"
  46.     try:
  47.         try:
  48.             echo.mainloop(everyEvent, 0)
  49.         except Quit:
  50.             pass
  51.     finally:
  52.         MacOS.EnableAppswitch(yield)    # Let Python have a go at events
  53.         echo.close()
  54.  
  55.  
  56. class EchoServer:
  57.     
  58.     suites = ['aevt', 'core', 'reqd']
  59.     
  60.     def __init__(self):
  61.         self.active = 0
  62.         #
  63.         # Install the handlers
  64.         #
  65.         for suite in self.suites:
  66.             AE.AEInstallEventHandler(suite, typeWildCard, self.aehandler)
  67.             print (suite, typeWildCard, self.aehandler)
  68.         self.active = 1
  69.         #
  70.         # Setup the apple menu and file/quit
  71.         #
  72.         self.appleid = 1
  73.         self.fileid = 2
  74.         
  75.         Menu.ClearMenuBar()
  76.         self.applemenu = applemenu = Menu.NewMenu(self.appleid, "\024")
  77.         applemenu.AppendMenu("All about echo...;(-")
  78.         applemenu.AppendResMenu('DRVR')
  79.         applemenu.InsertMenu(0)
  80.         
  81.         self.filemenu = Menu.NewMenu(self.fileid, 'File')
  82.         self.filemenu.AppendMenu("Quit/Q")
  83.         self.filemenu.InsertMenu(0)
  84.         
  85.         Menu.DrawMenuBar()
  86.         #
  87.         # Set interaction allowed (for the return values)
  88.         #
  89.         AE.AESetInteractionAllowed(kAEInteractWithAll)
  90.     
  91.     def __del__(self):
  92.         self.close()
  93.     
  94.     def close(self):
  95.         if self.active:
  96.             self.active = 0
  97.             for suite in self.suites:
  98.                 AE.AERemoveEventHandler(suite, typeWildCard)
  99.     
  100.     def mainloop(self, mask = everyEvent, timeout = 60*60):
  101.         while 1:
  102.             self.dooneevent(mask, timeout)
  103.     
  104.     def dooneevent(self, mask = everyEvent, timeout = 60*60):
  105.             got, event = Evt.WaitNextEvent(mask, timeout)
  106.             if got:
  107.                 self.lowlevelhandler(event)
  108.     
  109.     def lowlevelhandler(self, event):
  110.         what, message, when, where, modifiers = event
  111.         h, v = where
  112.         if what == kHighLevelEvent:
  113.             msg = "High Level Event: %s %s" % \
  114.                 (`code(message)`, `code(h | (v<<16))`)
  115.             self.handled_by_us = 0
  116.             try:
  117.                 AE.AEProcessAppleEvent(event)
  118.             except AE.Error, err:
  119.                 mymessage(msg + "\015AEProcessAppleEvent error: %s" % str(err))
  120.                 traceback.print_exc()
  121.             else:
  122.                 if self.handled_by_us == 0:
  123.                     print msg, "Handled by AE, somehow"
  124.                 else:
  125.                     print msg, 'Handled by us.'
  126.         elif what == keyDown:
  127.             c = chr(message & charCodeMask)
  128.             if modifiers & cmdKey:
  129.                 if c == '.':
  130.                     raise KeyboardInterrupt, "Command-period"
  131.                 else:
  132.                     self.menuhit(Menu.MenuKey(message&charCodeMask))
  133.             ##MacOS.HandleEvent(event)
  134.         elif what == mouseDown:
  135.             partcode, window = Win.FindWindow(where)
  136.             if partcode == inMenuBar:
  137.                 result = Menu.MenuSelect(where)
  138.                 self.menuhit(result)
  139.         elif what <> autoKey:
  140.             print "Event:", (eventname(what), message, when, (h, v), modifiers)
  141. ##            MacOS.HandleEvent(event)
  142.  
  143.     def menuhit(self, result):
  144.             id = (result>>16) & 0xffff    # Hi word
  145.             item = result & 0xffff        # Lo word
  146.             if id == self.appleid:
  147.                 if item == 1:
  148.                     mymessage("Echo -- echo AppleEvents")
  149.                 elif item > 1:
  150.                     name = self.applemenu.GetItem(item)
  151.                     Qd.OpenDeskAcc(name)
  152.             elif id == self.fileid:
  153.                 if item == 1:
  154.                     raise Quit
  155.     
  156.     def aehandler(self, request, reply):
  157.         print "Apple Event!"
  158.         self.handled_by_us = 1
  159.         parameters, attributes = aetools.unpackevent(request)
  160.         print "class =", `attributes['evcl'].type`,
  161.         print "id =", `attributes['evid'].type`
  162.         print "Parameters:"
  163.         keys = parameters.keys()
  164.         keys.sort()
  165.         for key in keys:
  166.             print "%s: %.150s" % (`key`, `parameters[key]`)
  167.             print "      :", str(parameters[key])
  168.         print "Attributes:"
  169.         keys = attributes.keys()
  170.         keys.sort()
  171.         for key in keys:
  172.             print "%s: %.150s" % (`key`, `attributes[key]`)
  173.         parameters['----'] = self.askreplyvalue()
  174.         aetools.packevent(reply, parameters)
  175.         
  176.     def askreplyvalue(self):
  177.         while 1:
  178.             str = myaskstring('Reply value to send (python-style)', 'None')
  179.             try:
  180.                 rv = eval(str)
  181.                 break
  182.             except:
  183.                 pass
  184.         return rv
  185.         
  186. _eventnames = {
  187.     keyDown: 'keyDown',
  188.     autoKey: 'autoKey',
  189.     mouseDown: 'mouseDown',
  190.     mouseUp: 'mouseUp',
  191.     updateEvt: 'updateEvt',
  192.     diskEvt: 'diskEvt',
  193.     activateEvt: 'activateEvt',
  194.     osEvt: 'osEvt',
  195. }
  196.  
  197. def eventname(what):
  198.     if _eventnames.has_key(what): return _eventnames[what]
  199.     else: return `what`
  200.  
  201. def code(x):
  202.     "Convert a long int to the 4-character code it really is"
  203.     s = ''
  204.     for i in range(4):
  205.         x, c = divmod(x, 256)
  206.         s = chr(c) + s
  207.     return s
  208.  
  209.  
  210. if __name__ == '__main__':
  211.     main()
  212.